*****************************************************************
TRIGGER 1 VERIFIER ABONNEMENT LOCATION ABONNES 
*****************************************************************

create or replace trigger tr_effectuer_location_abo  
before insert on locationvelo
for each row
declare 
	date_fin_abo date;
	is_abo integer;
begin  
	select count(*) into is_abo from clientabo where idclient = :new.idclient;
	if(is_abo>0)then
		select datefinvaliditeabo into date_fin_abo from clientabo where idclient = :new.idclient;
		if (date_fin_abo<sysdate) then
			raise_application_error(-20001,'Client n est plus abonne!!!');  
		end if;
	end if;  
end;
/

*****************************************************************
TRIGGER 2_1 VERIFIER CAPACITE VEHICULE CHANGER VEHICULE DE ROUTINE
*****************************************************************

create or replace trigger tr2_1_capacite_routine_vehi 
before update on routines
for each row
declare 
	nombre_tache integer;
	pointeur integer := 1;
	nombre_velo integer;
    type_tache integer;
	capa_vehicule integer;
	en_charge integer :=0;
begin  
	if(:old.immatvehicule != :new.immatvehicule) then
		select count(*) into nombre_tache from tache where idroutines = :new.idroutines;
		select capavehicule into capa_vehicule from vehicule where immatvehicule = :new.immatvehicule;
		
	
		WHILE nombre_tache >0 LOOP
		   select nombrevelo into nombre_velo from tache where idroutines = :new.idroutines and seqtache=pointeur;
		   select idtypetache into type_tache from tache where idroutines = :new.idroutines and seqtache=pointeur;
		   
		   if(type_tache = 1) then
		   	en_charge := en_charge + nombre_velo;
			if(en_charge>capa_vehicule) then 
				raise_application_error(-20001,'le nombrebre de velo est superieur que la capacite de la vehicule!!'); 		
			end if;
		   end if;

     		   if(type_tache = 2) then
		   	en_charge := en_charge - nombre_velo;
		   end if;

		   pointeur := pointeur + 1;
		   nombre_tache := nombre_tache - 1;
		END LOOP;
	end if;
end;
/


*****************************************************************
TRIGGER 2_2 VERIFIER CAPACITE VEHICULE ET SEQ EFFECTUANT UNE TACHE
*****************************************************************

create or replace trigger tr2_2_capacite_seq_tache_vehi 
before insert on tache
for each row
declare 
	nombre_tache integer;
	capa_vehicule integer;
	max_seq integer;
	
	pointeur integer := 1.0;
	nombre_velo integer;
    type_tache integer;
	
	en_charge integer :=0;
begin  
		select count(*) into nombre_tache from tache where idroutines = :new.idroutines;
		select max(capavehicule) into capa_vehicule from tache natural join routines natural join vehicule where idroutines = :new.idroutines;
		
		if(nombre_tache=0) then
			if(:new.seqtache!=1) then
				raise_application_error(-20001,'la sequence n est pas bonne!!!'); 
			end if;
		end if;
		
		if(nombre_tache>0) then
			select max(seqtache) into max_seq from tache where idroutines = :new.idroutines;
			max_seq := max_seq + 1;
			if(max_seq!=:new.seqtache) then
				raise_application_error(-20001,'la sequence est pas bonne!!!'); 
			end if;
				
		end if;
	
		WHILE nombre_tache >0 LOOP
		   select nombrevelo into nombre_velo from tache where idroutines = :new.idroutines and seqtache=pointeur;
		   select idtypetache into type_tache from tache where idroutines = :new.idroutines and seqtache=pointeur;
		   
		   if(type_tache = 1) then
			   	en_charge := en_charge + nombre_velo;
				
		   end if;

     		if(type_tache = 2) then
			   	en_charge := en_charge - nombre_velo;
				
		   	end if;

		   pointeur := pointeur + 1;
		   nombre_tache := nombre_tache - 1;
		END LOOP;
		
		if(:new.idtypetache = 1) then
			en_charge :=en_charge + :new.nombrevelo;
		end if;
		
		if(:new.idtypetache = 2) then
			en_charge :=en_charge - :new.nombrevelo;
		end if;
		
		if(en_charge<0) then 
			raise_application_error(-20001,'le nombre de velo dans la vehicule ne peut etre negatif!!'); 		
		end if;
		if(en_charge>capa_vehicule) then 
			raise_application_error(-20001,'le vehicule est trop charge!!'); 		
		end if;
end;
/

*****************************************************************
TRIGGER 3 VERIFIER AMENDE ABONNES (2 AMENDES NON PAYEES) 
*****************************************************************

CREATE OR REPLACE TRIGGER TRIG_VERIF_AMENDE_ABONNE_1
BEFORE INSERT ON LocationVelo
FOR EACH ROW
DECLARE 
	nb integer;
BEGIN

SELECT count(idAmende) INTO nb
FROM Amende A, LocationVelo L
WHERE A.idLocation = L.idLocation
AND L.idClient = :NEW.idClient
AND A.statutAmende = 0;


if(nb > 1) then
	Raise_application_error(-20014,'Cet abonn� a 2 amendes non pay�es.');
end if;
End;
/

*****************************************************************
TRIGGER 4 VERIFIER AMENDE ABONNES (1 AMENDE DE PLUS DUN MOIS)
*****************************************************************

create or replace trigger tr4_location_amende_plusunmois  
before insert on locationvelo  
for each row
declare 
	num_amende_nopayee integer;
	date_amende date;
begin  
	select count(*) into num_amende_nopayee from amende a join locationvelo l on a.idlocation = l.idlocation where l.idclient = :new.idclient and a.statutamende = 0;
	if(num_amende_nopayee=1) then
		select dateamende into date_amende from amende a join locationvelo l on a.idlocation = l.idlocation where l.idclient = :new.idclient and a.statutamende = 0;
		date_amende := date_amende + interval '30' day;
		if(date_amende < sysdate ) then
			raise_application_error(-20001,'ce client a une amende non payee et de plus de 30 jours!!!');  
		end if;

	end if;  
end;
/

*****************************************************************
TRIGGER 5 VERIFIER QUE LABONNE NA PAS DEJA UNE LOCATION EN COURS
*****************************************************************

CREATE OR REPLACE TRIGGER TRIG_CONTROLELOCATIONUNIQUE
before insert on LOCATIONVELO
for each row
declare
nbLoc integer;
begin
select count(*) into nbLoc from LOCATIONVELO where :new.idClient=idClient and finloc IS null;
DBMS_OUTPUT.PUT_LINE(nbLoc);
if nbLoc>0 then raise_application_error(-10111,'Une location est d�j� en cours pour ce client!');
end if;
end;
/

*****************************************************************
TRIGGER 6 GENERER AMENDE
*****************************************************************

CREATE OR REPLACE TRIGGER TRIG_GENERER_AMENDE
AFTER UPDATE ON LocationVelo
DECLARE 
	numLoc integer;
	nb integer;
BEGIN


SELECT count(idLocation) INTO nb 
FROM LocationVelo 
WHERE finLoc IS NOT NULL 
AND idLocation NOT IN(SELECT idLocation FROM Amende)
AND floor(((finLoc-debutLoc)*24*60*60)/3600) > 11;


if(nb > 0) then
	SELECT idLocation INTO numLoc 
FROM LocationVelo 
WHERE finLoc IS NOT NULL 
AND idLocation NOT IN(SELECT idLocation FROM Amende)
AND floor(((finLoc-debutLoc)*24*60*60)/3600) > 11;

	INSERT INTO AMENDE values(amende_seq.nextval,numLoc,10,SYSDATE,null,0);
end if;
End;
/

*****************************************************************
TRIGGER 7 VERIFIER RECOUVREMENT RESERVATIONS ABONNES
*****************************************************************

create or replace trigger tr7_reservation_sansrecouvre  
before insert on reservation 
for each row 
declare 
	num_reser integer;
begin  
	select count(*) into num_reser from reservation where idclient = :new.idclient and to_char(datedebutloc,'dd/mm/yyyy') like to_char(:new.datedebutloc,'dd/mm/yyyy');
	if(num_reser >0) then
		raise_application_error(-20001,'Ce client a deja reserve un velo a cette heure!!');  
	end if;  
end;
/

*****************************************************************
TRIGGER 8 VERIFIER NOMBRE VELO DISPONIBLES LORS DUNE NOUVELLE RESERVATION (VERSION 1)
*****************************************************************

CREATE GLOBAL TEMPORARY TABLE TEMP_RESERVATION AS SELECT * FROM RESERVATION WHERE 0=1;
CREATE OR REPLACE TRIGGER TRIG_DISPOVELORESERVE BEFORE INSERT ON RESERVATION FOR EACH ROW 
BEGIN 
INSERT INTO TEMP_RESERVATION(IDRESERV, IDSTATION, IDCLIENT, DATERESERV, DATEDEBUTLOC) VALUES (:NEW.IDRESERV, :NEW.IDSTATION, :NEW.IDCLIENT, :NEW.DATERESERV, :NEW.DATEDEBUTLOC);
END;
/
CREATE OR REPLACE TRIGGER TRIG_RESERVATION2 AFTER INSERT ON RESERVATION
DECLARE 
NB_VELODISPO INTEGER ; -- nombre de v�los disponible dans la station
NB_VELORESERV INTEGER ; -- nombre de v�los r�serv�s dans la station    
NB_CAPASTATION INTEGER ; -- nombre de borne de la station 
BEGIN 
FOR LIGNE IN (SELECT * FROM TEMP_RESERVATION) LOOP 
SELECT COUNT (*) INTO NB_VELODISPO FROM BORNETTE NATURAL JOIN VELO
WHERE IDSTATION=LIGNE.IDSTATION and IDVELO is not NULL and ETATVELO=1;
SELECT COUNT (*) INTO NB_VELORESERV FROM RESERVATION 
WHERE IDSTATION=LIGNE.IDSTATION AND DATEDEBUTLOC=LIGNE.DATEDEBUTLOC; --rajouter notion de date en plage horaire
SELECT COUNT (*) INTO NB_CAPASTATION FROM BORNETTE
WHERE IDSTATION=LIGNE.IDSTATION;
IF NB_CAPASTATION - NB_VELODISPO - NB_VELORESERV = 0 THEN 
raise_application_error(-20500,'Pas de velo disponible pour cette reservation!');
DELETE FROM RESERVATION WHERE IDRESERV=LIGNE.IDRESERV;
END IF ;
END LOOP ;
DBMS_OUTPUT.PUT_LINE('velo dispo ' || NB_VELODISPO ||', velo reserve ' || NB_VELORESERV || ', capacite station ' || NB_CAPASTATION);
DELETE FROM TEMP_RESERVATION;
END;
/

*****************************************************************
TRIGGER 9 VERIFIER RECOUVREMENT CLASSIFICATIONS (Version Sylvain)
TRIGGER 15 VERIFIER POSTERIORITE DATES CLASSIF
*****************************************************************

CREATE OR REPLACE TRIGGER TR_VERIF_CLASSIF
AFTER INSERT OR UPDATE ON Classification 
BEGIN

	FOR LIGNE0 IN (SELECT * FROM Classification) LOOP
		-- Dans un premier temps on v�rifie que la date de fin de la classif est post�rieure � la date de d�but de la classif
		IF LIGNE0.heuredebutclassif >= LIGNE0.heurefinclassif THEN
			raise_application_error(-20581,'La date de fin de classification doit �tre post�rieure � la date de d�but.');
		END IF;
		FOR LIGNE1 IN (SELECT * FROM Classification WHERE idStation=LIGNE0.idStation AND idClassif != LIGNE0.idClassif) LOOP
			-- DBMS_OUTPUT.PUT_LINE('Date 0 = '||LIGNE0.heuredebutclassif || ' ' || LIGNE0.heurefinclassif);
			-- DBMS_OUTPUT.PUT_LINE('Date 1 = '||LIGNE1.heuredebutclassif || ' ' || LIGNE1.heurefinclassif);
			-- Date 0 commence avant Date1
			IF LIGNE0.heuredebutclassif < LIGNE1.heuredebutclassif THEN
					-- DBMS_OUTPUT.PUT_LINE('Date 0 commence avant Date 1');
					-- Il faut que l'heure de fin de classif de Date 0 soit avant le d�but de la classif de Date 1
					IF LIGNE1.heuredebutclassif < LIGNE0.heurefinclassif THEN
						-- DBMS_OUTPUT.PUT_LINE('Impossible d ajouter cette nouvelle classification. (Cas 1)'||LIGNE1.idClassif);
						raise_application_error(-20580,'Cette classification chevauche une autre classification!');
					END IF;
			END IF;
		END LOOP;
	END LOOP ;	
END;
/ 


*****************************************************************
TRIGGER 10 VERIFIER VALIDATION TACHE PRECEDENTE
*****************************************************************

CREATE OR REPLACE TRIGGER TRIG_VERIF_TACHE_PREC
AFTER UPDATE ON Tache
DECLARE 
	nb integer;
BEGIN
				
FOR LIGNE IN (SELECT DISTINCT(T.idRoutines), min(seqTache) AS minimum FROM Tache T, Routines R WHERE T.idRoutines = R.idRoutines 
				AND T.DATEFINTACHE IS NULL AND tacheAnnule = 0 GROUP BY T.idRoutines) LOOP
	--dbms_output.put_line('D�but avec : idRoutines '|| LIGNE.idRoutines || 'et minimum : ' || LIGNE.minimum);	
	SELECT count(idTache) INTO nb
	FROM Tache
	WHERE idRoutines = LIGNE.idRoutines
	AND seqTache > LIGNE.minimum
	AND idTache IN		(SELECT idTache
						FROM Tache
						WHERE DATEFINTACHE IS NOT NULL
						OR TACHEANNULE = 1);
	--dbms_output.put_line('idRoutines '|| LIGNE.idRoutines || 'avec' || nb);	
	if(nb > 0) then
		Raise_application_error(-20013,'Impossible de valider la t�che concernant la routine '|| LIGNE.idRoutines);
	end if;
END LOOP ;
End;
/

*****************************************************************
TRIGGER 11 VERIFIER VALIDITE DUN CODE VPLUS
*****************************************************************

create or replace trigger tr11_vplus_valid
before update on clientticket  
for each row
begin  
	if(:old.codevplusutilise=1) then
		if(:new.codevplusutilise=0)then
			if(sysdate > :old.DATEVALIDITETICKET)then 
				raise_application_error(-20001,'ce code de vplus n est plus utilisable!!!');  
			end if;
		end if;

	end if;  
end;
/


*****************************************************************
TRIGGER 12 VERIFIER DESTINATION VEHICULE REGULATION (VERSION 1)
*****************************************************************

-- 1er d�clencheur, de niveau ligne, qui n'interroge plus la table mutante
-- � la place, il stocke dans la table temporaire les donn�es ins�r�es
CREATE OR REPLACE TRIGGER TRIG_VERIF_DESTINATION
AFTER UPDATE ON Tache 
DECLARE
	nb integer;
BEGIN 	
	FOR LIGNE0 IN (SELECT idStation FROM Station) LOOP
		nb := 0;
		FOR LIGNE IN (SELECT DISTINCT(T.idRoutines), min(seqTache) AS minimum FROM Tache T, Routines R WHERE T.idRoutines = R.idRoutines 
						AND T.DATEFINTACHE IS NULL AND tacheAnnule = 0 GROUP BY T.idRoutines) LOOP	
			FOR LIGNE2 IN (SELECT idTache, idStation FROM Tache WHERE idRoutines = LIGNE.idRoutines AND seqTache = LIGNE.minimum) LOOP
				IF(LIGNE0.idStation = LIGNE2.idStation) THEN
					nb := nb +1;
				END IF;
			END LOOP;
		END LOOP;
		IF(nb > 1) THEN
		Raise_application_error(-20012,'Actuellement '|| nb || ' vehicules se dirigent vers la station'|| LIGNE0.idStation);
		END IF;	
	END LOOP ;
END ;
/


-- SELECT TO_CHAR(SYSDATE, 'DD-MON-YYYY') FROM dual;

*****************************************************************
TRIGGER 13 VERIFIER UN SEUL NUMSEQ POUR UN JOUR ET UNE DATE 
*****************************************************************

CREATE GLOBAL TEMPORARY TABLE TEMP_TACHE AS SELECT * FROM TACHE WHERE 0=1;
CREATE OR REPLACE TRIGGER TRIG_CONTROLESEQJOURVEHIC BEFORE INSERT or UPDATE ON TACHE FOR EACH ROW 
BEGIN 
INSERT INTO TEMP_TACHE(IDTACHE, IDSTATION, IDROUTINES, SEQTACHE, DETAILTACHE, DATEFINTACHE, TACHEANNULE, COMMENTAIRETACHE) VALUES 
(:NEW.IDTACHE, :NEW.IDSTATION, :NEW.IDROUTINES, :NEW.SEQTACHE, :NEW.DETAILTACHE, :NEW.DATEFINTACHE, :NEW.TACHEANNULE, :NEW.COMMENTAIRETACHE);
END;
/
CREATE OR REPLACE TRIGGER TRIG_CONTROLESEQJOURVEHIC2
AFTER INSERT OR UPDATE ON TACHE
DECLARE
NB INTEGER;
BEGIN
FOR LIGNE IN (SELECT * FROM TEMP_TACHE) LOOP 
select count(*) INTO NB from TACHE where LIGNE.SEQTACHE=SEQTACHE and LIGNE.IDROUTINES = IDROUTINES;
DBMS_OUTPUT.PUT_LINE('occurrence ' || NB);
IF NB>1 THEN
raise_application_error(-20550,'Une meme routine ne peut avoir 2 fois le meme numero de sequence de tache');
END IF;
END LOOP;
DELETE FROM TEMP_TACHE;
END;

*****************************************************************
TRIGGER 14 UNE SEULE ROUTINE POUR UN VEHICULE ET UN JOUR
*****************************************************************

CREATE GLOBAL TEMPORARY TABLE TEMP_ROUTINES AS SELECT * FROM ROUTINES WHERE 0=1;
CREATE OR REPLACE TRIGGER TRIG_OCCURENCEROUTINE BEFORE INSERT or UPDATE ON ROUTINES FOR EACH ROW 
BEGIN 
INSERT INTO TEMP_ROUTINES(IDROUTINES, IMMATVEHICULE, DATEROUTINES) VALUES(:NEW.IDROUTINES, :NEW.IMMATVEHICULE, :NEW.DATEROUTINES);
END;
/
CREATE OR REPLACE TRIGGER TRIG_OCCURENCEROUTINE2
AFTER INSERT OR UPDATE ON ROUTINES
DECLARE
NB INTEGER;
BEGIN
FOR LIGNE IN (SELECT * FROM TEMP_ROUTINES) LOOP 
select count(*) INTO NB from ROUTINES where IMMATVEHICULE=LIGNE.IMMATVEHICULE and DATEROUTINES=LIGNE.DATEROUTINES;
DBMS_OUTPUT.PUT_LINE('occurrence ' || NB);
IF NB>1 THEN
raise_application_error(-20580,'Un vehicule ne peut pas avoir 2 routines un meme jour');
END IF;
END LOOP;
DELETE FROM TEMP_ROUTINES;
END;
/

*****************************************************************
TRIGGER 16 VERIFICATION COHERENCE LOCALISATION VELO
*****************************************************************

CREATE OR REPLACE TRIGGER TRIG_VERIF_VELO
AFTER UPDATE ON VELO
DECLARE
	NB_VELO_SANS_BORNETTE INTEGER;
	NB_VELO_SANS_LOCATION INTEGER;
	NB_VELO_SANS_REGULATION INTEGER;
	NB_VELO_SANS_MAINTENANCE INTEGER;
BEGIN

	-- Un v�lo avec la localisation Bornette est forc�ment rattach� � une bornette
	SELECT COUNT(idVelo) INTO NB_VELO_SANS_BORNETTE
	FROM VELO
	WHERE LocalisationVelo = 'Bornette'
	AND idVelo NOT IN 	(SELECT idVelo
						FROM BORNETTE);
						
	IF NB_VELO_SANS_BORNETTE > 0 THEN
		raise_application_error(-20580,'Un v�lo avec la localisation Bornette doit forc�ment �tre rattach� � une bornette.');
	END IF;
			
	-- Un velo avec la localisation Location est forcement ref�renc�e dans une location non termin�e
	SELECT COUNT(idVelo) INTO NB_VELO_SANS_LOCATION
	FROM VELO
	WHERE LocalisationVelo = 'Location'
	AND idVelo NOT IN 	(SELECT idVelo
						FROM LocationVelo
						WHERE Finloc IS NULL);

	IF NB_VELO_SANS_LOCATION > 0 THEN
		raise_application_error(-20580,'Un v�lo avec la localisation Location doit forc�ment �tre r�f�renc�e dans une location non termin�e.');
	END IF;
	
	-- Un v�lo avec la localisation Regulation est forc�ment r�f�renc�e dans une association ESTREGULEPAR
	SELECT COUNT(idVelo) INTO NB_VELO_SANS_REGULATION
	FROM VELO
	WHERE LocalisationVelo = 'Regulation'
	AND idVelo NOT IN 	(SELECT idVelo
						FROM ESTREGULEPAR E, Tache T
						WHERE E.idTache = T.idTache
						AND T.DATEFINTACHE IS NULL);
						-- Note : Si la t�che est annul�e les v�los seront toujours dans la voiture de r�gulation 

	IF NB_VELO_SANS_REGULATION > 0 THEN
		raise_application_error(-20580,'Un v�lo avec la localisation Regulation doit forc�ment �tre r�f�renc�e dans une t�che non termin�e.');
	END IF;
	
	-- Un v�lo avec la localisation Maintenance est forc�ment r�f�renc�e dans une association ESTMAINTENUPAR
	SELECT COUNT(idVelo) INTO NB_VELO_SANS_MAINTENANCE
	FROM VELO
	WHERE LocalisationVelo = 'Maintenance'
	AND idVelo NOT IN 	(SELECT idVelo
						FROM ESTMAINTENUPAR
						WHERE DATEFINMAINTENANCE IS NULL);

	IF NB_VELO_SANS_MAINTENANCE > 0 THEN
		raise_application_error(-20580,'Un v�lo avec la localisation Maintenance doit forc�ment �tre r�f�renc�e dans une maintenance non termin�e.');
	END IF;

END;
/

*****************************************************************
TRIGGER 17 VERIFICATION SEQUENCES TACHES
*****************************************************************
			
CREATE OR REPLACE TRIGGER TRIG_VERIF_SEQTACHE
AFTER INSERT OR UPDATE ON Tache 
DECLARE
	nb integer;
BEGIN 	
	-- Parcours de toutes les routines
	FOR LIGNE0 IN (SELECT idRoutines FROM Routines) LOOP
		SELECT count(*) INTO nb
		FROM Tache T1, Tache T2
		WHERE T1.idTache != T2.idTache		
		AND T1.idRoutines = LIGNE0.idRoutines
		AND T2.idRoutines = LIGNE0.idRoutines
		AND T1.seqtache = T2.seqtache;
				
		IF(nb > 0) THEN
			Raise_application_error(-20013,'La routine numero '|| LIGNE0.idRoutines || ' a ' || nb || ' taches avec le meme numero de sequence.');
		END IF;	
	END LOOP ;	
END;
/

*****************************************************************
TRIGGER 18 VERIFICATION DEPLACEMENT VELOS
Un v�hicule de r�gulation ne peut pas d�placer de v�lo si sa t�che ne lui impose pas de le faire
ou si le nombre de v�lo d�j� d�plac� est �gal � celui demand� par la t�che.
*****************************************************************
			
CREATE OR REPLACE TRIGGER TRIG_VERIF_DEPLACEMENT
AFTER INSERT OR UPDATE ON ESTREGULEPAR
DECLARE
	nb integer;
BEGIN 	
	-- Parcours de toutes les taches qui ont un nombre de v�lo � d�placer affect�
	FOR LIGNE0 IN (SELECT idTache, NOMBREVELO FROM TACHE) LOOP
		SELECT count(*) INTO nb
		FROM ESTREGULEPAR
		WHERE idTache = LIGNE0.idTache;
				
		IF(nb > LIGNE0.NOMBREVELO) THEN
			Raise_application_error(-20013,'La tache numero '|| LIGNE0.idTache || ' doit deplacer uniquement ' || LIGNE0.NOMBREVELO || ' velos.');
		END IF;	
	END LOOP ;	
END;
/

*****************************************************************
TRIGGER 19 VERIFICATION REGULATION VELO
Un m�me v�lo ne peut pas �tre dans deux r�gulation diff�rentes
*****************************************************************
			
CREATE OR REPLACE TRIGGER TRIG_VERIF_REGULATION
AFTER INSERT OR UPDATE ON ESTREGULEPAR
DECLARE
	nb integer;
BEGIN 	
	-- R�cup�ration de tous les identifiants de v�los qui apparaissent 2 fois dans les associations ESTREGULEPAR
	--FOR LIGNE0 IN (SELECT * FROM ESTREGULEPAR) LOOP
		--SELECT count(*) INTO nb
		--FROM ESTREGULEPAR
		--WHERE idVelo = LIGNE0.idVelo
		--AND idTache != LIGNE0.idTache;
				
		--IF(nb > 0) THEN
		--	Raise_application_error(-20013,'Le velo '|| LIGNE0.idVelo || ' est deja en cours de regulation.');
		--END IF;	
	--END LOOP ;	
END;
/

